/*
 功能：Cordova app 在线升级
 调用方式：updateApp.checkUpdate = function (apkUrl, succCallbackl, errorCallback)
 参数说明：
 1、apkUrl: 获取 app 版本号 的 api,样本
 var apkUrl_APK = "http://api2.dhbm.cn:8080/getApkVersion.php?who=yltt_apk";
 var apkUrl_IPA = "http://api2.dhbm.cn:8080/getApkVersion.php?who=yltt_ipa";
 2、succCallbackl ：在线升级成功回调函数
 3、errorCallback ：在线升级失败，或取消升级回调函数

 版本： 1.0.16122801
 版本号不再放进 function
 修改了一个 BUG（判断 apkUrl null 时）
 增加了 "后台下载" 功能

 版本： 1.0.161229
 增加了：about
 alert 换成 cordova 的 dialog.alert
 confirm 改成 cordova 的 dialog.confirm

 版本： 1.0.170110
 增加了：手机权限限制，无法下载提示后，直接跳转到 setting
 更改提示： 请设置应用信息中 <权限>下的 <存储>为允许，下次自动升级或检查更新！
 */

var updateApp = function () {
};

updateApp.about = function () {
    if (window.cordova) {
        getSuccCallback = function (version) {
            //这是本地打包后 app 版本号,在 config.xml 配置
            console.log("app 版本号在这里>>>>>>");
            console.log(version);
            appVersion = version;

            function alertDismissed() {
                // do something
            }

            var mMessage = " 当前版本 ：" + appVersion;
            var mTitle = "关于..."
            navigator.notification.alert(
                mMessage,  // message
                alertDismissed,         // callback
                mTitle,            // title
                '知道了'                  // buttonName
            );

        };
        getFailCallback = function (res) {
            console.log(res);
        };

        cordova.getAppVersion.getVersionNumber(getSuccCallback, getFailCallback);
    }
    else {
        console.log("缺少 cordova 支持");
        // do nothing
    }
};

/*
 检查更新 改为 promise 返回
 返回不方便
 需要使用链式promise，还不如 callback 方便
 暂时保留，待处理
 */
updateApp.checkUpdatePromise = function (apkUrl) {
    deferred = jQuery.Deferred();
    succCallback = function (res) {
        console.log("succCallback resolve");
        deferred.resolve;
        return defer.promise;
    }
    failCallback = function (res) {
        console.log("failCallback reject");
        deferred.reject;
        return defer.promise;
    }

    updateApp.checkUpdate(apkUrl, succCallback, failCallback);
};

// 检查更新
updateApp.checkUpdate = function (apkUrl, succCallbackl, errorCallback) {
    //var apkUrl = "http://api2.dhbm.cn/wap/GetVersionAppH5/?key=3414d916c27e14bc3e9e08a30660d5ec268e76d009aee2a2c5a828973f40d223&appid=8880018&flag=com.dhbm.lmsd&encoding=utf-8&resulttype=json";
    //样本 : {"apk":"http://m.dhbm.cn/app/qy/lmsd/an/dhbm.lmsd.1.0.160707.apk","version":"1.0","sub":"160707"}

    if (apkUrl == null || apkUrl == "") {
        console.log("空的apkUrl");
        return null;
    }
    ;

    var apkVersion = "未可知";
    var apkNameUrl = "";
    var apkName = "";
    var appVersion = "";

    var getJSONsuccCallback = function (response) {
        //console.log(response);
        apkVersion = response.version + "." + response.sub;
        apkNameUrl = response.apk;
        console.log("apkName 222 === " + apkNameUrl);
        console.log("apkVersion 222 === " + apkVersion);

        //获取url最后一部分,作为apk 名字
        var x = apkNameUrl.split('/');
        var l = x.length;

        if (l < 1) {
            var sss = "api 返回结果异常,请检查!" + apkNameUrl;
            if (errorCallback0) {
                errorCallback(sss);
            }
        }

        apkName = x[l - 1];
        //只有手机上才会继续比较版本号,升级
        // pc上只会执行前面一部分,方便在电脑调试
        if (window.cordova) {
            getSuccCallback = function (version) {
                //这是本地打包后 app 版本号,在 config.xml 配置
                // console.log(version);
                appVersion = version;
                //console.log("appVersion 111 === " + appVersion);
                //比较版本号,简单处理:不比较大小,只要不一样,就升级
                //待规范之后，改成 appVersion < apkVersion)
                if (appVersion != apkVersion) {
                    showUpdateConfirm(apkNameUrl, apkName, appVersion, apkVersion, succCallbackl, errorCallback);
                }
                else {
                    var sss = "已经是最新版本" + appVersion;
                    console.log(sss);
                    if (succCallbackl) {
                        succCallbackl(sss);
                    }
                }
            };
            getFailCallback = function (res) {
                console.log(res);
            };

            cordova.getAppVersion.getVersionNumber(getSuccCallback, getFailCallback);
        }
        else {
            var sss = "<h4> 当前版本 < " + appVersion + "></h4>";
            sss = sss + "<h4> 网上apk版本 < " + apkVersion + "></h4>";
            if (errorCallback) {
                errorCallback(sss);
            }
        }
    };

    //首先获取网上 apk 版本号
    $.getJSON(apkUrl, null, getJSONsuccCallback);
};

// 显示是否更新对话框
showUpdateConfirm = function (apkNameUrl, apkName, appVersion, apkVersion, succCallbackl, errorCallback) {

    function onConfirm(buttonIndex) {
        if (buttonIndex == 1) {
            //选择了：升级
            var u = navigator.userAgent;
            var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
            console.log("这是 ios 吗? =====" + isiOS);
            if (isiOS) {
                //苹果直接返回去，打开升级网址
                if (succCallbackl) {
                    succCallbackl("IOS");
                }
            }
            else {
                downLoadApk(apkNameUrl, apkName, succCallbackl, errorCallback);
            }
        }
        else {
            //选择了第二项： 不升级
            sss = "取掉了升级！！！";
            console.info("取掉了升级！！！");
            if (errorCallback) {
                errorCallback(sss);
            }
        }
    }

    var mMessage = "是否升级到版本 " + apkVersion + " ?";
    var mTitle = "新版本提示";
    navigator.notification.confirm(
        mMessage, // message
        onConfirm,            // callback to invoke with index of button pressed
        mTitle,           // title
        ['现在升级', '不升级']     // buttonLabels
    );

};

downLoadApk = function (apkNameUrl, apkName, succCallbackl, errorCallback) {
    var url = apkNameUrl;
    //var url = "http://m.dhbm.cn/app/qy/lmsd/an/dhbm.lmsd.1.0.160804.apk";
    //"m.dhbm.cn\/app\/qy\/\/lmsd\/an\/dhbm.lmsd.1.0.160804.apk";
    // var url = "http://m.dhbm.cn\/app\/qy\/\/lmsd\/an\/dhbm.lmsd.1.0.160804.apk";

    //by wzh 20161225 var targetPath = "file:///storage/sdcard0/Download/" + apkName;
    var targetPath = cordova.file.externalRootDirectory + apkName;
    //APP下载存放的路径，可以使用cordova file插件进行相关配置
    var trustAllHosts = true;
    var options = {};
    var downloadProgress = 0;
    var downloadFinished = false;

    //首先放置一个 loading
    /*
     var mTitle = "升级提示";
     var mLoadingContent = "正在下载中...";
     var progressLoading = window.navigator.dialogsPlus.progressStart(mTitle, mLoadingContent);
     //progressLoading.setValue(0);
     */

    var mTitle = "升级提示";
    var mLoadingContent = "正在下载中...";
    //add by wzh 20160802 允许取消下载
    errorFn = function () {
        console.error("errorFn errorFn ====");
        download.abort();

        if (errorCallback) {
            errorCallback("下载发生错误，任务终止");
        }
    };

    cancelFn = function () {
        //这是 按了 后台下载 后的 回调，实际没法终止啊
        //因为 window.navigator.dialogsPlus.progressStart 只能放一个 代表 取消 的按钮，所以，要么中断，要么后台继续任务
        console.log("后台下载 ====");
        // 在后台进行，这里只能 do nothing，仅仅是隐藏了 progress
    };

    cancelable = true;
    cancelableText = '使用后台升级';

    var progressLoading = window.navigator.dialogsPlus.progressStart(mTitle, mLoadingContent,
        errorFn, cancelable, cancelableText, cancelFn);
    //progressLoading.setValue(0);

    console.log("FileTransfer FileTransfer ====");
    var ft = new FileTransfer();

    var uri = encodeURI(url);
    console.log("FileTransfer FileTransfer ====2222");
    if (options && options.timeout !== undefined && options.timeout !== null) {
        $timeout(function () {
            ft.abort();
        }, options.timeout);
        options.timeout = null;
        if (errorCallback) {
            errorCallback("下载超时！456");
        }
    }
    ;
    console.log("FileTransfer FileTransfer ====333");
    ft.onprogress = function (progress) {
        downloadProgress = parseInt((progress.loaded / progress.total) * 100);
        //console.log("downloadProgress ====" + downloadProgress);

        setTimeout(function () {
            progressLoading.setValue(downloadProgress);
        });
    };
    console.log("FileTransfer FileTransfer ====4444");
    ft.downloadSuccess = function (res) {
        console.log("FileTransfer FileTransfer ====555");
        downloadProgress = 100;
        console.log("downloadProgress 完成====" + downloadProgress);
        progressLoading.hide();

        //fileOpener2.open 也有一个 回掉，但是好像回不来本app，先简单在这里直接毁掉
        //安装器安装完成后，选择 打开 ，会再次启动程序
        if (succCallbackl) {
            succCallbackl("downloadProgress 完成====");
        }

        setTimeout(openAndInstallApk(targetPath, succCallbackl, errorCallback), 200);
    };

    ft.downloadFailed = function (error) {
        progressLoading.hide();

        function onConfirm(buttonIndex) {
            if (buttonIndex == 1) {
                //选择了：现在设置 app权限
                console.info("选择了：现在设置！！！");
                openSetting('application_details');

                //因为不知是否开启了权限，暂时按照 error 流程处理
                sss = "设置完成后返回！！！";
                console.info(sss);
                if (errorCallback) {
                    errorCallback(sss);
                }
            }
            else {
                //选择了第二项： 不升级
                sss = "现在不设置！！！";
                console.info("现在不设置！！！");
                if (errorCallback) {
                    errorCallback(sss);
                }
            }
        }

        var mMessage = "请设置应用信息中 <权限>下的 <存储>为允许，下次自动升级或检查更新！ " ;
        var mTitle = "手机权限限制 提示";
        navigator.notification.confirm(
            mMessage, // message
            onConfirm,            // callback to invoke with index of button pressed
            mTitle,           // title
            ['现在设置', '以后再说']     // buttonLabels
        );

    };

    ft.download(uri, targetPath, ft.downloadSuccess, ft.downloadFailed, trustAllHosts, options);

};

//打开 apk,系统会自动执行安装
openAndInstallApk = function (targetPath, succCallbackl, errorCallback) {
    cordova.plugins.fileOpener2.open(targetPath, 'application/vnd.android.package-archive',
        function () {
            // 成功
            console.log("open 成功=== " + targetPath);
            //open 成功，不代表选择了 安装或取消，所以好像回不到这里，程序结构先保留，待处理
            if (succCallbackl) {
                succCallbackl(targetPath);
            }
        },
        function () {
            // 错误
            var sss = "非法的安装包,请检查!" + err;
            if (errorCallback) {
                errorCallback(sss);
            }
        });
};

//add by wzh 20161210
openSetting = function(setting){
    if (window.cordova && window.cordova.plugins.settings) {
        console.log('openNativeSettingsTest is active');
        window.cordova.plugins.settings.open(setting, function() {
                console.log('opened settings');
            },
            function () {
                console.log('failed to open settings');
            }
        );
    } else {
        console.log('openNativeSettingsTest is not active!');
    }
}